<?php

/**
 * @author Paweł Napieracz
 * @version 1.0
 */
class Modul_Admin_Zarzadzanie_StronaEdycja extends Modul_Admin_Abstract {

    public function inicjalizuj() {
        $this->tytul = 'Edycja ładowania modułów na strony';

        if (isset($this->param['akcja']) &&
                $this->param['akcja'] == 'edytuj') {
            $this->edytuj();
        } else if (isset($this->param['akcja']) &&
                $this->param['akcja'] == 'dodaj') {
            $this->dodaj();
        } else if (isset($this->param['akcja']) &&
                $this->param['akcja'] == 'usun') {
            $this->usun();
        }
    }

    private function edytuj() {
        $id = isset($this->param['id']) ? $this->param['id'] : $_POST['id'];
        if (!is_numeric($id)) {
            die();
        }

        $tab = new AutoDB('cms_strona', 'id');
        $strona = $tab->Get($id);

        $tabModuly = new AutoDB('cms_modul');
        $wszystkieModulyTmp = $tabModuly->Select('*')->Run()->AsArray();
        $wszystkieModuly = array();

        foreach ($wszystkieModulyTmp as $v) {
            $wszystkieModuly[$v['id']] = $v['nazwa'];
        }

        /* Zaciąganie modułów przypisanych do strony */
        $tabStronaModuly = new AutoDB('cms_strona_modul');
        $zapytanie = $tabStronaModuly->
                        Select('cms_strona_modul.polozenie, cms_strona_modul.kolejnosc, cms_modul.nazwa')->
                        Join('cms_modul', 'cms_modul.id = cms_strona_modul.id_modul')->
                        Where('id_strona', $id)->OrderBy('kolejnosc asc')->Run();
        if ($zapytanie !== false) {
            $zapytanie = $zapytanie->AsArray();
        }
        //tworzenie tablicy pobranych modułów
        $moduly = array();
        if (is_array($zapytanie)) {
            foreach ($zapytanie as $modul) {
                $moduly[$modul['polozenie']][$modul['kolejnosc']] = $modul['nazwa'];
            }
        }

        /* Wygenerowanie formularza */
        $form = new Form_Strona();
        $this->daneTPL['form']['poczatek'] =
                $form->otworzForma('/cms/strona/edycja/akcja,edytuj.html');
        $this->daneTPL['form']['strona'] =
                $form->generujStrone($strona);
        $this->daneTPL['form']['rozmieszczenieModulow'] =
                $form->generujRozmieszczenieModulow(
                        isset($_POST['moduly']) ? $_POST['moduly'] : $moduly, $wszystkieModuly);
        $this->daneTPL['form']['koniec'] =
                $form->zamknijForma();
        /* Sprawdzenie czy wysłano dane i czy dane są zwalidowanie poprawnie */
        if (isset($_POST['szablon'])) {
            $bledy = $this->waliduj();
            if (Form_Valid::isValid($bledy)) {

                $strona->Set('szablon', $_POST['szablon']);
                $strona->Set('url', $_POST['url']);
                $strona->save();
                $idStrony = $id;
                /* Zapisywanie modułów */
                if (isset($_POST['moduly'])) {
                    /* Usuwamy wszystkie zlinkowane wcześniej moduły */
                    $tabModulStrona = new AutoDB('cms_strona_modul');
                    $tabModulStrona->
                            Query("Delete From {$tabModulStrona->TableName()} Where id_strona = '$idStrony'", false);
                    /* Dodajemy moduły */
                    foreach ($_POST['moduly'] as $pozycja => $moduly) {
                        foreach ($moduly as $kolejnosc => $modul) {
                            //pobranie id modułu
                            $idModulu = $tabModuly->
                                    Select('*')->
                                    Where(array('nazwa' => $modul))->
                                    GetFirst();
                            $idModulu = $idModulu['id'];
                            //dodanie modułu
                            $pola = array(
                                'id_modul' => $idModulu,
                                'id_strona' => $idStrony,
                                'polozenie' => $pozycja,
                                'kolejnosc' => $kolejnosc
                            );
                            $tabModulStrona->Create()->SetAll($pola)->Save();
                        }
                    }
                }
                $this->zakoncz('/cms/strona/');
            } else {
                $this->daneTPL['bledy'] = $bledy;
            }
        }
    }

    private function dodaj() {
        $tab = new AutoDB('cms_strona');
        $strona = $tab->Create();
        $tabModuly = new AutoDB('cms_modul');
        $wszystkieModulyTmp = $tabModuly->Select('*')->Run()->AsArray();
        $wszystkieModuly = array();
        foreach ($wszystkieModulyTmp as $v) {
            $wszystkieModuly[$v['id']] = $v['nazwa'];
        }
        /* Wygenerowanie formularza */
        $form = new Form_Strona();
        $this->daneTPL['form']['poczatek'] =
                $form->otworzForma('/cms/strona/edycja/akcja,dodaj.html');
        $this->daneTPL['form']['strona'] =
                $form->generujStrone($strona);
        $this->daneTPL['form']['rozmieszczenieModulow'] =
                $form->generujRozmieszczenieModulow(
                        isset($_POST['moduly']) ? $_POST['moduly'] : array(), $wszystkieModuly);
        $this->daneTPL['form']['koniec'] =
                $form->zamknijForma();
        /* Sprawdzenie czy wysłano dane i czy dane są zwalidowanie poprawnie */
        if (isset($_POST['szablon'])) {
            $bledy = $this->waliduj();
            if (Form_Valid::isValid($bledy)) {

                $strona->Set('szablon', $_POST['szablon']);
                $strona->Set('url', $_POST['url']);
                $strona->save();
                $idStrony = $strona[''];
                /* Zapisywanie modułów */
                if (isset($_POST['moduly'])) {
                    /* Usuwamy wszystkie zlinkowane wcześniej moduły */
                    $tabModulStrona = new AutoDB('cms_strona_modul');
                    $tabModulStrona->
                            Query("Delete From {$tabModulStrona->TableName()} Where id_strona = '$idStrony'", false);
                    /* Dodajemy moduły */
                    foreach ($_POST['moduly'] as $pozycja => $moduly) {
                        foreach ($moduly as $kolejnosc => $modul) {
                            //pobranie id modułu
                            $idModulu = $tabModuly->
                                    Select('*')->
                                    Where(array('nazwa' => $modul))->
                                    GetFirst();
                            $idModulu = $idModulu['id'];
                            //dodanie modułu
                            $pola = array(
                                'id_modul' => $idModulu,
                                'id_strona' => $idStrony,
                                'polozenie' => $pozycja,
                                'kolejnosc' => $kolejnosc
                            );
                            $tabModulStrona->Create()->SetAll($pola)->Save();
                        }
                    }
                }
                $this->zakoncz('/cms/strona/');
            } else {
                $this->daneTPL['bledy'] = $bledy;
            }
        }
    }

    private function waliduj() {
        /* Walidacja */
        if (Form_Valid::isEmpty(Form_Valid::getFormValue('szablon'))) {
            $bledy[] = "Szablon nie może być pusty";
        }

        //pobieram wszystkie strony i sprawdzam czy url jest unikatowy
        $tab = new AutoDB('cms_strona');
        $wynik = $tab->Select('id, url')->
                Where(array('url' => Form_Valid::getFormValue('url')))->
                GetFirst();
        if (Form_Valid::isEmpty(Form_Valid::getFormValue('url'))) {
            $bledy[] = "Url nie może być pusty";
        } else if (Form_Valid::isTooLong(Form_Valid::getFormValue("url"), 249)) {
            $bledy[] = "Url może mieć maksymalnie 249 znaków";
        } else if ($wynik !== false &&
                ($wynik['id'] != Form_Valid::getFormValue("id"))) {
            $bledy[] = "Twój url nie jest unikatowy!";
        } else if (!Form_Valid::isAlpha(Form_Valid::getFormValue("url"), '0-9\/\-_')) {
            $bledy[] = "Url może składać się z liter, cyfr, ukośnika i myślników!";
        }

        return $bledy;
    }

    private function usun() {
        if (!isset($this->param['id']) || !is_numeric($this->param['id'])) {
            die();
        }
        $tabStrona = new AutoDB('cms_strona', 'id');
        $tabStronaModuly = new AutoDB('cms_strona_modul');
        $zapytanie = $tabStronaModuly->
                Select('*')->
                Where('id_strona', $this->param['id'])->
                Run();
        if ($zapytanie !== false) {
            $zapytanie = $zapytanie->AsArray();
        }
        $ok = true;
        /**
         * Mała notka:
         * Jest to zrobione dosyć czasochłonną metodą. 
         * Jednak nie ma metody delete działającej tak jak select w AutoDB.
         */
        /* Usuwanie modułów podpiętych do strony */
        if (is_array($zapytanie)) {
            foreach ($zapytanie as $v) {
                if ($tabStronaModuly->Delete($v['id']) === false) {
                    $ok = false;
                }
            }
        }
        /* Usuwanie wpisu strony */
        if ($tabStrona->Delete($this->param['id']) === false) {
            $ok = false;
        }
        /* Jeżeli coś się nie powiodło wywalenie błędu */
        if ($ok === false)
            echo 'blad';
        die();
    }

}

?>
